#ifndef STRUCTURE_H
#define STRUCTURE_H

#define FOREACH(X,L)		for( X=L; X!=NULL; X=X->suivant )
#define ERREUR(msg)		printf ("Erreur [%s:%d] : ", __FILE__, __LINE__);printf(msg);printf("\n");
#define ERREUR2(msg,params)	printf ("Erreur [%s:%d] : ", __FILE__, __LINE__);printf(msg,params);printf("\n");

/* Constante pour la resolution */
#define FAUX		0
#define VRAI		1
#define INCONSISTANT	2
#define CONSISTANT	3

/* Etat des variables */
#define INCONNU		4

/* Valeur d'un BRANCHEMENT */
#define NON 	0
#define PREMIER	1
#define SECOND	2

#ifdef COUNT
	int nbSolutions;
#endif


/* Gere les donnees relatives au passage de dpc en iteratif */
typedef struct _Historique{
	int variable;
	int branchement;
	struct _Historique *suivant;

} Historique;



/* Litteral */
typedef struct _Litteral{
	//valeur de la variable
	int variable;
	//variable suivante
	struct _Litteral *suivant;

} Litteral;


/* Clauses */
typedef struct{

	//{Inconnu,Consistant, Inconsistant}
	int etat;
	//Cardinalite
	int card;
	//Nombre de Litteraux
	int taille;
	//Liste de Litteraux
	Litteral *tete;

} Clause;

/* liste de clauses */
typedef struct _ListeClause{

	//Signe {-1, 1}
	int signe;
	//VRAI si la variable a ete affectee, FAUX sinon
	int affectee;
	//Clause etudiee
	Clause *clause;
	//Clause suivante
	struct _ListeClause *suivant;

} ListeClause;



/* Liste des litteraux */
typedef struct{

	//Nombre de clauses
	int taille;
	//{Inconnu, Vrai, Faux}
	int etat;
	//Liste des Clauses
	ListeClause *litteraux;

} ListeLitteraux;

/* Formule */
typedef struct{

	int taille;
	int nbLitteraux;
	int nbClauses;
	Clause **clauses;
	ListeLitteraux *litteraux;

} Formule;

#endif

